package com.phenix.mvp.util;

import android.support.annotation.NonNull;
import android.view.View;

import com.phenix.annotation.aspect.MemoryCache;
import com.phenix.annotation.aspect.TimeLog;
import com.phenix.apt.InstanceFactory;

import java.lang.reflect.ParameterizedType;
import java.util.Collection;


public class TUtil {
    /**
     * 获取泛型的class
     * @param o 泛型携带者
     * @param index 泛型index
     * @return 泛型class
     */
    @TimeLog
    public static Class<?> getTClass(Object o, int index) {
        Class clazz = null;
        if (!(o instanceof Collection) && o.getClass().getGenericSuperclass() instanceof ParameterizedType) {
            clazz = (Class<?>) ((ParameterizedType) (o.getClass().getGenericSuperclass())).getActualTypeArguments()[index];
        }
        return clazz;
    }


    /**
     * 通过实例工厂去实例化相应类
     *
     * @param o     带泛型的对象
     * @param index 需要实例化的对象在泛型中的位置
     * @param <T> 泛型
     * @return 返回实例的泛型类型
     */
    @TimeLog
    public static <T> T getInstance(Object o, int index) {
        if (!(o instanceof Collection) && o.getClass().getGenericSuperclass() instanceof ParameterizedType) {
            Class mClass = (Class<T>) ((ParameterizedType) (o.getClass().getGenericSuperclass())).getActualTypeArguments()[index];
            return getInstance(mClass);
        }
        return null;
    }

    /**
     * 通过实例工厂去实例化相应类
     *
     * @param clazz 要实例化的对象class
     * @param <T>
     * @return 返回实例的泛型类型
     */
    @TimeLog
    public static <T> T getInstance(@NonNull Class clazz) {
        try {
            return (T) InstanceFactory.create(clazz);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过实例工厂去实例化相应类
     *
     * @param clazz 要实例化的对象class
     * @param view  所在view节点
     * @param <T> 泛型
     * @return 返回实例的泛型类型
     */
    @TimeLog
    public static <T> T getInstance(@NonNull Class clazz, @NonNull View view) {
        return (T) InstanceFactory.create(clazz, view);
    }


    /**
     * 通过class的完整包名获取实例
     * @param className 完整包
     * @return instance
     */
    @MemoryCache
    public static Class<?> forName(@NonNull String className) {
        try {
            return Class.forName(className);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }


}
